﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DAMBAOCLPM
{
    public partial class frmDonvi : Form
    {
        public frmDonvi()
        {
            InitializeComponent();
        }
        int dong;
        bool themoi;
        bool sua=false;
        string temp_str;
        int temp_int;
        private void frmDonvi_Load(object sender, EventArgs e)
        {
            //Dinh vi vi tri form con va kich co.
            this.Width = clsVariables.Width_This - 21;
            this.Height = clsVariables.Height_This - clsVariables.Height_TopMenu - 65;
            this.Top = clsVariables.Height_TopMenu - 66;
            this.Left = 0;
            
            //-----------------------------------

            // Kết nối CSDL.

            //--------------
            
            Lock_Where(); //Khóa có điều kiện.
            sua = true; 
            Shown_data(); // Hiển thị dữ liệu.

            // Ẩn các button cảnh báo.
            btnNoCheck_ten.Visible = false;
            btnCheck_ten.Visible = false;
        }
        public void setnull()
        {
            txtMadonvi.Text = "";
            txtTendonvi.Text = "";
        }

        // Khóa các textbox và các button - không điều kiện.

        public void Locktext()
        {
            txtTendonvi.Enabled = false;
            txtMadonvi.Enabled = false;

            btnThem.Enabled = true;
            btnLuu.Enabled = false;
            btnSua.Enabled = true;
            btnXoa.Enabled = true;
        }

        //-----------------------------------------------

        // Hàm mở khóa các textbox và các button.

        public void Unlocktext()
        {
            txtMadonvi.Enabled = true;
            txtTendonvi.Enabled = true;

            btnThem.Enabled = false;
            btnLuu.Enabled = true;
            btnSua.Enabled = false;
            btnXoa.Enabled = false;
        }

        //-------------------------------------

        // Hiển thị dữ liệu lên lưới - datagridview.

        public void Shown_data()
        {
            for (int i = 0; i <= grdDonvi.Columns.Count-1; i++)
            {
                grdDonvi.Columns.RemoveAt(i);
                i--;
            }
            grdDonvi.Columns.Add("stt", "STT");
            grdDonvi.Columns.Add("makhoa", "Mã khoa");
            grdDonvi.Columns.Add("tenkhoa", "Tên khoa");
            grdDonvi.Columns[0].SortMode = 0;
            grdDonvi.Columns[1].SortMode = 0;
            grdDonvi.Columns[2].SortMode = 0;

            grdDonvi.Columns[0].DataPropertyName = "STT";

            grdDonvi.Columns[0].Width = 40;
            grdDonvi.Columns[1].DataPropertyName = "makhoa";
            grdDonvi.Columns[2].DataPropertyName = "tenkhoa";
            grdDonvi.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

            grdDonvi.Columns[0].Resizable = DataGridViewTriState.False;
            grdDonvi.Columns[1].Resizable = DataGridViewTriState.False;
            grdDonvi.Columns[2].Resizable = DataGridViewTriState.False;
            grdDonvi.ColumnHeadersHeight = 35;
            grdDonvi.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            grdDonvi.RowTemplate.Height = 30;
            grdDonvi.RowTemplate.Resizable = DataGridViewTriState.False;

           DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM DONVI ORDER BY MAKHOA", clsConnection.con);
            da.Fill(dt);
            dt.Columns.Add("STT", Type.GetType("System.Int32"));
            for (int i = 0; i <= dt.Rows.Count - 1; i++)
            {
                dt.Rows[i]["STT"] = i + 1;
                
            }
            grdDonvi.DataSource = dt;
            grdDonvi.AllowUserToAddRows = false;
            
        }

        //--------------------------------------


        //Lấy dữ liệu dòng được lick trong datagridview đưa lên textbox.

        private void grdDonvi_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            dong = e.RowIndex;
            if (dong >= 0&&dong<=grdDonvi.Rows.Count-1&&themoi==false)
            {
                txtMadonvi.Text = grdDonvi.Rows[dong].Cells[0].Value.ToString();
                txtTendonvi.Text = grdDonvi.Rows[dong].Cells[1].Value.ToString();
            }
        }

        //---------------------------------------------------------------

        private void grdDonvi_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
           
        }

        private void frmDonvi_Resize(object sender, EventArgs e)
        {
            
        }

        // Sự kiện nút thêm được lick.

        private void btnThem_Click(object sender, EventArgs e)
        {
            setnull();
            Unlocktext();
            themoi = true;
            Refresh_Check();
            txtMadonvi.Enabled = false;
            Them_Madonvi();
            
        }

        public void Them_Madonvi()
        {
            SqlCommand com = new SqlCommand("SELECT * FROM DONVI ORDER BY MAKHOA", clsConnection.con);
            SqlDataReader dr = com.ExecuteReader();
            while (dr.Read())
            {
                temp_str = dr.GetValue(0).ToString();
            }
            dr.Close();

            temp_int = Convert.ToInt32(temp_str);
            if (temp_int < 9) txtMadonvi.Text = "0" + (temp_int + 1);
            else txtMadonvi.Text = (temp_int + 1).ToString();
        }
        //----------------------------

        // Sự kiện nút lưu được lick.
        public bool Test_space_ten()
        {
            bool kq = false;
            string temp = txtTendonvi.Text;
            temp = temp.Replace(" ", "");
            if (temp.Length == 0)
            {
                kq = true;
                txtTendonvi.Clear();
            }
            return kq;
        }
        public bool Test_vaten()
        {
            bool kq = false;
            string temp = txtTendonvi.Text;
            temp = temp.Replace("&", "");
            temp = temp.Replace(" ", "");
            if (temp.Length == 0)
                kq = true;
            return kq;
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {

            if (themoi == true)
            {
                if (!Test_Null() || Test_space_ten()) MessageBox.Show("Tên đơn vị không thể để trống", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                //else if (!Test_Madv()) MessageBox.Show("Mã đơn vị tồn tại.\nVui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else if (!Test_Tendv()) MessageBox.Show("Tên đơn vị tồn tại.\nvui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                //else if (!Test_Leght()) MessageBox.Show("Mã đơn vị là 2 ký tự số.\nVui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else if (Test_vaten()) MessageBox.Show("Tên đơn vị không thể chỉ chứa ký tự đặc biệt");
                else
                {
                    SqlCommand com = new SqlCommand("INSERT INTO DONVI(makhoa,tenkhoa) VALUES(@makhoa,@tenkhoa)", clsConnection.con);
                    SqlParameter p1 = new SqlParameter("@makhoa", SqlDbType.NVarChar);
                    SqlParameter p2 = new SqlParameter("@tenkhoa", SqlDbType.NVarChar);

                    p1.Value = txtMadonvi.Text;
                    p2.Value = txtTendonvi.Text;
                    com.Parameters.Add(p1);
                    com.Parameters.Add(p2);

                    com.ExecuteNonQuery();
                    Shown_data();
                    Lock_Where();
                    themoi = false;
                    string temp_madv = txtMadonvi.Text; // Lấy giá trị để Focus.
                    setnull();
                    Refresh_Check();
                    // Tiêu điểm lên đơn vị mới thêm.
                    for (int i = 0; i <= grdDonvi.Rows.Count - 1; i++)
                    {
                        if (temp_madv == grdDonvi.Rows[i].Cells[0].Value.ToString())
                        {
                            grdDonvi.FirstDisplayedScrollingRowIndex = i;
                            grdDonvi.Rows[i].Selected = true;
                        }
                    }
                }
            }


            else
            {
                if (!Test_Null()||Test_space_ten()) MessageBox.Show("Tên đơn vị không thể để trống", "Cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else if (Test_Tendv_Sua()) MessageBox.Show("Tên đơn vị tồn tại.\nVui lòng kiểm tra lại", "Cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else if (Test_vaten()) MessageBox.Show("Tên đơn vị không thể chỉ chứa ký tự đặc biệt");
                else
                {
                    SqlCommand com = new SqlCommand("UPDATE DONVI SET tenkhoa=N'" + txtTendonvi.Text + "' WHERE makhoa=N'" + txtMadonvi.Text + "'", clsConnection.con);
                    com.ExecuteNonQuery();
                    Shown_data();
                    string temp_madv = txtMadonvi.Text;
                    Lock_Where();
                    setnull();
                    sua = true;
                    Refresh_Check();
                    
                    for (int i = 0; i <= grdDonvi.Rows.Count - 1; i++)
                    {
                        if (temp_madv == grdDonvi.Rows[i].Cells[0].Value.ToString())
                        {
                            grdDonvi.FirstDisplayedScrollingRowIndex = i;
                            grdDonvi.Rows[i].Selected = true;
                        }
                    }
         
                    
                }
            }
            
        }
        public void Delete_Space()
        {
            Char[] charArr = txtTendonvi.Text.ToCharArray();
            int n = txtTendonvi.Text.Length;
            // Xóa khoảng trắng đầu
            while (charArr[0] == ' ')
            {
                for (int i = 0; i < n - 1; i++)
                    charArr[i] = charArr[i + 1];
                n--;
            }
            // Xóa khoảng trắng cuối.
            while (charArr[n - 1] == ' ')
            {
                n--;
            }
            // Xóa khoảng trắng giữa.
            for (int i = 1; i < n; i++)
                if (charArr[i] == ' ' && charArr[i + 1] == ' ')
                {
                    for (int j = i; j < n - 1; j++)
                        charArr[j] = charArr[j + 1];
                    i--;
                    n--;
                }
            txtTendonvi.Clear();
            for (int i = 0; i < n; i++)
                txtTendonvi.Text += charArr[i].ToString();
        }

        //----------------------------

        // Sự kiện nút sữa được lick.

        private void btnSua_Click(object sender, EventArgs e)
        {
            sua = false;
            Unlocktext();
            themoi = false;
            txtMadonvi.Enabled = false;
            Refresh_Check();
        }
        //-------------------------

        // Sự kiện nút xóa được lick.

        private void btnXoa_Click(object sender, EventArgs e)
        {
            DialogResult DR = MessageBox.Show("Bạn có chắc muốn xóa đơn vị "+txtTendonvi.Text,"Xóa", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (DialogResult.OK == DR)
            {
                
                if (Test_Donvi_Exist_Thisinh()) MessageBox.Show("Đơn vị " +txtTendonvi.Text + " tồn tại tham chiếu đến sinh viên.\nKhông thể xóa!", "Xóa", MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                {
                    SqlCommand com = new SqlCommand("DELETE DONVI WHERE makhoa='" + txtMadonvi.Text + "'", clsConnection.con);
                    try
                    {
                        com.ExecuteNonQuery();
                        Shown_data();
                        setnull();
                        Refresh_Check();
                    }
                    catch
                    {
                        MessageBox.Show("Xoa that bai");
                    }
                }
            }
            else if (DialogResult.Cancel == DR)
            {
            }

            //-----------------------------
            
        }
        // Hàm kiểm tra mã đơn vị có tồn tại hay không - Trị trả về Bool.
        public bool Test_Madv()
        {
            bool kq = true;
            SqlCommand com2 = new SqlCommand("SELECT * FROM DONVI", clsConnection.con);
            SqlDataReader dr = com2.ExecuteReader();
            while (dr.Read())
            {
                if (txtMadonvi.Text == dr.GetValue(0).ToString()) kq = false;
            }
            dr.Close();
            return kq;
        }
        //---------------------------------------------------------------

        // Hàm kiểm tra tên đơn vị có tồn tại hay không - Trị trả về Bool.

        public bool Test_Tendv()
        {
            bool kq2 = true;
            SqlCommand com3 = new SqlCommand("SELECT * FROM DONVI", clsConnection.con);
            SqlDataReader dr1 = com3.ExecuteReader();
            while (dr1.Read())
            {
                if (txtTendonvi.Text.ToUpper() == dr1.GetValue(1).ToString().ToUpper()) kq2 = false;
            }
            dr1.Close();
            return kq2;
        }

        //------------------------------------------------------------------

        // Hàm kiểm tra xem mã đơn vị hoặc tên đơn vị có null không - trị trả về Bool.

        public bool Test_Null()
        {
            if (txtTendonvi.Text == "" || txtMadonvi.Text == "") return false;
            else return true;
        }

        //-------------------------------------------------------------------------

        // Hàm chỉ cho phép nhập số và độ dài là 2.

        private void txtMadonvi_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
            if (Char.IsDigit(e.KeyChar) && txtMadonvi.Text.Length == 2)
            {
                e.Handled = true;
            }
            if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }

           
        }

        //---------------------------------------

        // Hàm kiểm tra độ dài mã đơn vị có đúng bằng 2 không.

        public bool Test_Leght()
        {
            return txtMadonvi.Text.Length == 2;
        }
        //---------------------------------------------------

        //  Sự kiện nút hủy được lick.

        private void btnHuy_Click(object sender, EventArgs e)
        {
            setnull();
            Lock_Where();
            themoi = false;
            sua = true;
            Shown_data();
            Refresh_Check();
           
        }
        
        //---------------------------

        // Sự kiện TextChanged - Mã đơn vị.

        private void txtMadonvi_TextChanged(object sender, EventArgs e)
        {
            if (txtMadonvi.Text == "")
            {
                btnSua.Enabled = false;
                btnXoa.Enabled = false;
            }
            else if (themoi == false&&sua==true)
            {
                btnSua.Enabled = true;
                btnXoa.Enabled = true;
            }
            if (txtMadonvi.Text == "" || txtTendonvi.Text == "")
                btnLuu.Enabled = false;
            else btnLuu.Enabled = true;

        }

        //-----------------------


        // Sự kiện TextChanged - Tên đơn vị.

        private void txtTendonvi_TextChanged(object sender, EventArgs e)
        {
            if (txtTendonvi.Text =="")
            {
                btnSua.Enabled = false;
                btnXoa.Enabled = false;
            }
            
            else if(themoi==false&&sua==true)
            {
                btnSua.Enabled = true;
                btnXoa.Enabled = true;
            }
            if (txtMadonvi.Text == "" || txtTendonvi.Text == "")
                btnLuu.Enabled = false;
            else btnLuu.Enabled = true;
        }

        //---------------------------------

        // Hàm khóa các TextBox và Button - Có điều kiện.
        public void Lock_Where()
        {
            if (txtTendonvi.Text == "" || txtMadonvi.Text == "")
            {
                Locktext();
                btnXoa.Enabled = false;
                btnSua.Enabled = false;
            }
            else  Locktext();
        }
        //--------------------------------

        private void panel2_Paint(object sender, PaintEventArgs e)
        {

        }
        public bool Test_Tendv_Sua()
        {
            bool kq = false;

            SqlCommand com3 = new SqlCommand("SELECT * FROM DONVI", clsConnection.con);
            SqlDataReader dr1 = com3.ExecuteReader();
            while (dr1.Read())
            {
                if (txtTendonvi.Text.ToUpper() == dr1.GetValue(1).ToString().ToUpper()&&txtMadonvi.Text!=dr1.GetValue(0).ToString()) kq = true;
            }
            dr1.Close();
            return kq;
        }

        public bool Test_Donvi_Exist_Thisinh()
        {
            bool kq = false;
             SqlCommand com3 = new SqlCommand("SELECT MAKHOA FROM THISINH", clsConnection.con);
            SqlDataReader dr1 = com3.ExecuteReader();
            while (dr1.Read())
            {
                if (txtMadonvi.Text ==dr1.GetValue(0).ToString()) kq = true;
            }
            dr1.Close();
            return kq;
        }

        private void txtMadonvi_Leave(object sender, EventArgs e)
        {
            
        }

        public bool Test_null_ma()
        {
            return txtMadonvi.Text == "";
        }
        public bool Test_null_ten()
        {
            return txtTendonvi.Text == "";
        }

        private void txtMadonvi_Validating(object sender, CancelEventArgs e)
        {

        }

        private void txtTendonvi_Validating(object sender, CancelEventArgs e)
        {
            if (!Test_space_ten()) Delete_Space();
            if(!Test_vaten()) 
            btnCheck_ten.Visible = false;
            btnNoCheck_ten.Visible = false;
            // Kiểm tra tên.
            if (themoi == true)
            {
                if (!Test_Tendv()) btnNoCheck_ten.Visible = true;
                else btnCheck_ten.Visible = true;

            }
            else if (themoi == false)
            {
                if (Test_null_ten() || Test_Tendv_Sua()) btnNoCheck_ten.Visible = true;
                else btnCheck_ten.Visible = true;
            }
        }
        public void Refresh_Check()
        {
            btnCheck_ten.Visible = false;
            btnNoCheck_ten.Visible = false;

        }

        private void txtTendonvi_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar > 32 && e.KeyChar <= 37)||(e.KeyChar>=39&&e.KeyChar<=47) || (e.KeyChar >= 58 && e.KeyChar <= 64) || (e.KeyChar >= 91 && e.KeyChar <= 96) || e.KeyChar >= 123 && e.KeyChar <= 126)
                e.Handled = true;

            if (txtTendonvi.Text.Length >= 50)
                e.Handled = true;


            if (Char.IsControl(e.KeyChar) && (e.KeyChar == 127 || e.KeyChar == 8 || e.KeyChar == 32)||e.KeyChar==13)
                e.Handled = false;

            // Xử lý khi nhấn enter trong textBox tên đơn vị.

            if (e.KeyChar == 13)
            {
                if (!Test_space_ten()) Delete_Space();

                if (themoi == true)
                {
                    if (!Test_Null() || Test_space_ten()) MessageBox.Show("Tên đơn vị không thể để trống", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //else if (!Test_Madv()) MessageBox.Show("Mã đơn vị tồn tại.\nVui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    else if (!Test_Tendv()) MessageBox.Show("Tên đơn vị tồn tại.\nvui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //else if (!Test_Leght()) MessageBox.Show("Mã đơn vị là 2 ký tự số.\nVui lòng kiểm tra lại!", "Thêm mới", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    else
                    {
                        SqlCommand com = new SqlCommand("INSERT INTO DONVI(MAKHOA,TENKHOA) VALUES(@MAKHOA,@TENKHOA)", clsConnection.con);
                        SqlParameter p1 = new SqlParameter("@MAKHOA", SqlDbType.NVarChar);
                        SqlParameter p2 = new SqlParameter("@TENKHOA", SqlDbType.NVarChar);

                        p1.Value = txtMadonvi.Text;
                        p2.Value = txtTendonvi.Text;
                        com.Parameters.Add(p1);
                        com.Parameters.Add(p2);

                        com.ExecuteNonQuery();
                        Shown_data();
                        Lock_Where();
                        themoi = false;
                        string temp_madv = txtMadonvi.Text; // Lấy giá trị để Focus.
                        setnull();
                        Refresh_Check();
                        // Tiêu điểm lên đơn vị mới thêm.
                        for (int i = 0; i <= grdDonvi.Rows.Count - 1; i++)
                        {
                            if (temp_madv == grdDonvi.Rows[i].Cells[0].Value.ToString())
                            {
                                grdDonvi.FirstDisplayedScrollingRowIndex = i;
                                grdDonvi.Rows[i].Selected = true;
                            }
                        }
                    }
                }


                else
                {
                    if (!Test_Null() || Test_space_ten()) MessageBox.Show("Tên đơn vị không thể để trống", "Cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    else if (Test_Tendv_Sua()) MessageBox.Show("Tên đơn vị tồn tại.\nVui lòng kiểm tra lại", "Cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    else
                    {
                        SqlCommand com = new SqlCommand("UPDATE DONVI SET TENKHOA=N'" + txtTendonvi.Text + "' WHERE MAKHOA=N'" + txtMadonvi.Text + "'", clsConnection.con);
                        com.ExecuteNonQuery();
                        Shown_data();
                        string temp_madv = txtMadonvi.Text;
                        Lock_Where();
                        setnull();
                        sua = true;
                        Refresh_Check();

                        for (int i = 0; i <= grdDonvi.Rows.Count - 1; i++)
                        {
                            if (temp_madv == grdDonvi.Rows[i].Cells[0].Value.ToString())
                            {
                                grdDonvi.FirstDisplayedScrollingRowIndex = i;
                                grdDonvi.Rows[i].Selected = true;
                            }
                        }


                    }
                }
            
            }
            //-----------------------------------------------

        }

        private void grdDonvi_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
        {
        }

        private void grdDonvi_MouseDown(object sender, MouseEventArgs e)
        {
        }

        private void grdDonvi_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
        {
        }

        private void grdDonvi_Enter(object sender, EventArgs e)
        {
        }

        private void txtMadonvi_DragEnter(object sender, DragEventArgs e)
        {
        }
    }
    }
